package com.naiterui.ehp.bs.patient.service;

import com.naiterui.ehp.bp.bo.emr.AddPatientRecordInitializeBO;
import com.naiterui.ehp.bp.bo.patient.PatientBO;
import com.naiterui.ehp.bp.bo.patient.PatientBaseBO;
import com.naiterui.ehp.bp.bo.patient.RequireReplyTemplateMsgBO;
import com.naiterui.ehp.bp.domain.Patient;
import com.naiterui.ehp.bp.support.exception.BusinessException;
import com.naiterui.ehp.bs.patient.bo.notice.RegisterParamBO;
import com.naiterui.ehp.bs.patient.utils.exception.PatientBusinessException;
import com.naiterui.ehp.bs.patient.vo.DeviceVerifyVO;
import com.naiterui.ehp.bs.patient.vo.inner.InnerPatientVO;
import com.naiterui.ehp.bs.patient.vo.patient.PatientVO;
import com.naiterui.ehp.bs.patient.vo.requestparam.PatientBaseParam;
import java.math.BigInteger;
import java.util.List;

/**
 * 患者业务逻辑接口
 *
 * @version 2015年6月18日 下午5:07:29 by Amber
 * @Description
 * @see
 */
public interface IPatientService {

    /**
     * 获取患者基础信息
     *
     * @param id
     * @return 患者vo
     * @throws BusinessException PatientVo <返回值描述>
     * @History 2015年6月19日 下午1:17:01 by Amber
     */
    PatientVO getPatientBaseInfo(Long id) throws PatientBusinessException;

    /**
     * 登录逻辑处理 通过openId获取患者用户信息、加密信息以及b2c用户信息。
     *
     * @param openId
     * @return 患者实体信息含患者id，加密sign，患者b2c用户id（可能没有）
     * @throws BusinessException PatientVo <用户不存在>
     * @History 2015年6月20日 下午3:01:00 by Amber
     */
    PatientVO login(String openId) throws BusinessException;

    /**
     * 保存患者基础信息
     *
     * @param patientId 患者id
     * @param baseParam 基础信息
     * @return PatientVo <返回值描述>
     * @History 2015年6月24日 下午7:36:28 by Amber
     */
    PatientVO saveBaseInfo(Long patientId, PatientBaseParam baseParam) throws PatientBusinessException;

    /**
     * 保存手机号 IPatientService.savePhone()<BR> <P>Author : Amber </P> <P>Date : 2015年9月17日 </P>
     *
     * @param patientId 目标患者
     * @param phoneNum  新手机号
     * @return
     * @throws PatientBusinessException
     */
    PatientVO savePhone(Long patientId, String phoneNum) throws PatientBusinessException;


    /**
     * 获取患者简报
     *
     * @param patientId 患者id
     * @param unionKey  密钥
     * @return PatientVo <患者简要信息>
     * @History 2015年6月25日 下午2:35:23 by Amber
     */
    PatientVO getSimpleInfo(Long patientId, String unionKey) throws PatientBusinessException;

    /**
     * 提交意见
     *
     * @param patientId  患者id
     * @param suggestion
     * @param phone      手机号 void <返回值描述>
     * @History 2015年6月25日 下午10:55:28 by Amber
     */
    void saveSuggest(Long patientId, String suggestion, String phone) throws PatientBusinessException;

    /**
     * b2c用户信息绑定
     *
     * @param unionId 唯一标识
     * @param userId  b2c用户id
     * @throws Exception void <返回值描述>
     * @History 2015年6月27日 下午2:59:28 by Amber
     */
    void addUser(String unionId, Long userId) throws PatientBusinessException;

    /**
     * 增加新欢患者积分
     *
     * @param patientId 患者id
     * @return void <返回值描述>
     * @throws Exception
     * @History 2015年7月3日 下午11:25:26 by Amber
     */
    void addNewPatientPoint(Long patientId) throws PatientBusinessException;

    /**
     * 用户手机号唯一校验
     *
     * @param phoneNum 手机号
     * @return boolean <true:通过，目标手机号不存在；false：不通过，手机号已存在>
     * @History 2015年7月5日 下午9:22:43 by Amber
     */
    boolean unionValidate(String phoneNum);

    /**
     * 获取患者私人医生信息，是否有私人医生。 IPatientService.getPersonalInfo()<BR> <P>Author : Amber </P> <P>Date : 2015年8月6日 </P>
     *
     * @param openId
     * @return
     * @throws Exception
     */
    PatientVO getPersonalInfo(String openId) throws PatientBusinessException;

    /**
     * 提供获取用户信息的接口，用于b2c创建处方药回拨单信息纪录了。 IPatientService.getPatientInfoForB2c()<BR> <P>Author : Amber </P> <P>Date : 2015年8月8日 </P>
     *
     * @param unionId
     * @return
     */
    PatientVO getPatientInfoForB2c(String unionId) throws PatientBusinessException;

    /**
     * 取消关注公众号 IPatientService.cancelAttend()
     *
     * @param openId
     * @throws BusinessException
     * @Author Amber
     * @Date 2015年12月3日
     * @since 1.0.0
     */
    void cancelAttend(String openId) throws BusinessException;

    /**
     * 获取用户openId IPatientService.getOpenId()
     *
     * @param unionId
     * @return
     * @throws BusinessException
     * @Author Amber
     * @Date 2015年12月3日
     * @since 1.0.0
     */
    PatientVO getOpenId(String unionId) throws BusinessException;

    /**
     * 获取患者实体 IPatientService.getPatient()
     *
     * @param patientId
     * @return
     * @throws BusinessException
     * @Author Amber
     * @Date 2015年12月8日
     * @since 1.0.0
     */
    Patient getPatient(Long patientId);

    /**
     * 是否存在私有医生 IPatientService.getPersonalIds()
     *
     * @param patientId
     * @return
     * @Author YongYang
     * @Date 2016年7月21日
     * @since 1.0.0
     */
    List<BigInteger> getPersonalIds(Long patientId);

    /**
     * 获取校验信息 IPatientService.getVerifyInfo()
     *
     * @param patientId
     * @param deviceSN
     * @return
     * @throws PatientBusinessException
     * @Author chenlin
     * @Date 2016年8月5日
     * @since 1.0.0
     */
    DeviceVerifyVO getVerifyInfo(Long patientId, String deviceSN) throws PatientBusinessException;

    /**
     * 根据患者unionId获取患者信息 IPatientService.getPatientByUnionId()
     *
     * @param unionId
     * @return
     * @Author guoyongxiang
     * @Date 2017年9月19日
     * @since 2.11.0
     */
    InnerPatientVO getPatientById(String unionId, Long patientId);

    /**
     * 注册-保存患者信息
     *
     * @param register 用户注册信息
     */
    void saveRegisterInfo(RegisterParamBO register) throws BusinessException;

    /**
     * 医患关系绑定
     *
     * @param openId   openId
     * @param doctorId 医生ID
     * @return
     * @throws BusinessException businessException
     */
    void saveBindInfo(String openId, Long doctorId) throws BusinessException;

    /**
     * 微信H5授权，业务code换取token
     *
     * @param code
     * @return
     */
    String updateCode2token(String code) throws PatientBusinessException;

    /**
     * 医生处理患者求药，暂停用药模板消息通知
     *
     * @param requireReplyTemplateMsgBO
     */
    void requireProcessNotice(RequireReplyTemplateMsgBO requireReplyTemplateMsgBO);

    /**
     * 通过不同id获取患者信息
     *
     * @param unionId
     * @param miniAppId
     * @param patientId
     * @return
     * @throws PatientBusinessException
     */
    PatientBO getPatientInfo(String unionId, String miniAppId, Long patientId) throws PatientBusinessException;

    /**
     * 通过unionId绑定微信小程序id
     *
     * @param unionId
     * @param miniAppId
     * @return
     * @throws PatientBusinessException
     */
    Boolean bindMiniOpenId(String unionId, String miniAppId, String nickName, String avatar, Integer gender,
        String phone) throws PatientBusinessException;

    /**
     * 根据id获取患者基础信息
     *
     * @param patientId
     * @return
     * @throws PatientBusinessException
     */
    PatientBaseBO getPatientBaseInfoById(Long patientId) throws PatientBusinessException;

    AddPatientRecordInitializeBO getAddRecordInitializerInfo(Long inquirerId, String sessionId);

    void addPatientWithMiniapp(String miniOpenId, String unionId);

    /**
     * 获取患者id
     *
     * @param miniOpenId 小程序openid
     * @return 患者id
     */
    Long getPatientIdByMiniOpenId(String miniOpenId);

    void sendSignInMsg(String openId);
}
